package com.yxj.dries.lib.image.app;

import android.annotation.SuppressLint;
import android.app.Application;
import android.content.Context;
import android.graphics.PointF;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;

import jp.wasabeef.glide.transformations.BlurTransformation;
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
import jp.wasabeef.glide.transformations.gpu.VignetteFilterTransformation;

/**
 * 网络图片的工具类
 * <p>
 * (1)ImageView设置图片（错误图片）
 * （2）ImageView设置图片---BitMap(不设置默认图)
 * （3）设置RelativeLayout
 * （4）设置LinearLayout
 * （5）设置FrameLayout
 * （6）高斯模糊------ RelativeLayout
 * （7）高斯模糊------ LinearLayout
 * （8）圆角显示图片  ImageView
 * 使用工具类
 * （9）多种样式（模糊+圆角）
 *
 * @author ZSY
 */
public class ImageLoaderManager {


    /**
     * (1)
     * 显示图片Imageview
     *
     * @param context   上下文
     * @param errImg    错误的资源图片
     * @param url       图片链接
     * @param imageView 组件
     */
    public static void showImageView(Context context, int errImg, String url,
                                     ImageView imageView) {
        Glide.with(context).load(url)// 加载图片
                .error(errImg)// 设置错误图片
                .transition(DrawableTransitionOptions.withCrossFade()) // 设置淡入淡出效果，默认300ms，可以传参
                .placeholder(errImg)// 设置占位图
                .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)// 缓存修改过的图片
                .into(imageView);
    }

    /**
     * （2）
     * 获取到Bitmap---不设置错误图片，错误图片不显示
     *
     * @param context
     * @param imageView
     * @param url
     */

    public static void showImageViewGone(Context context,
                                         final ImageView imageView, String url) {
        Glide.with(context).load(url)
                .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)// 缓存修改过的图片
                .into(new CustomTarget<Drawable>() {
                    @Override
                    public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                        imageView.setVisibility(View.VISIBLE);
                        imageView.setBackground(resource);
                    }

                    @Override
                    public void onLoadCleared(@Nullable Drawable placeholder) {
                        imageView.setVisibility(View.GONE);
                    }
                });

    }

    /**
     * （3）
     * 设置RelativeLayout
     * <p>
     * 获取到Bitmap
     *
     * @param context
     * @param errImg
     * @param url
     * @param bgLayout
     */

    public static void showImageView(Context context, int errImg, String url,
                                     final RelativeLayout bgLayout) {
        Glide.with(context).load(url).error(errImg)// 设置错误图片
                .transition(DrawableTransitionOptions.withCrossFade())
                .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)// 缓存修改过的图片
                .placeholder(errImg)// 设置占位图
                .into(new CustomTarget<Drawable>() {
                    @Override
                    public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                        bgLayout.setVisibility(View.VISIBLE);
                        bgLayout.setBackground(resource);
                    }

                    @Override
                    public void onLoadCleared(@Nullable Drawable placeholder) {
                        bgLayout.setVisibility(View.GONE);
                        bgLayout.setBackground(placeholder);
                    }
                });

    }

    /**
     * （4）
     * 设置LinearLayout
     * <p>
     * 获取到Bitmap
     *
     * @param context
     * @param errImg
     * @param url
     * @param bgLayout
     */

    public static void showImageView(Context context, int errImg, String url,
                                     final LinearLayout bgLayout) {
        Glide.with(context).load(url).error(errImg)// 设置错误图片
                .transition(DrawableTransitionOptions.withCrossFade())
                .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)// 缓存修改过的图片
                .placeholder(errImg)// 设置占位图
                .into(new CustomTarget<Drawable>() {
                          @Override
                          public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                              bgLayout.setBackground(resource);
                          }

                          @Override
                          public void onLoadCleared(@Nullable Drawable placeholder) {
                              bgLayout.setBackground(placeholder);
                          }
                      }
                );

    }

    /**
     * （5）
     * 设置FrameLayout
     * <p>
     * 获取到Bitmap
     *
     * @param context
     * @param errImg
     * @param url
     * @param frameBg
     */

    public static void showImageView(Context context, int errImg, String url,
                                     final FrameLayout frameBg) {
        Glide.with(context).load(url).error(errImg)// 设置错误图片
                .transition(DrawableTransitionOptions.withCrossFade())
                .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)// 缓存修改过的图片
                .placeholder(errImg)// 设置占位图
                .into(new CustomTarget<Drawable>() {

                    @Override
                    public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                        frameBg.setVisibility(View.VISIBLE);
                        frameBg.setBackground(resource);
                    }

                    @Override
                    public void onLoadCleared(@Nullable Drawable placeholder) {
                        frameBg.setVisibility(View.GONE);
                        frameBg.setBackground(placeholder);
                    }
                });

    }

    /**
     * （6）
     * 获取到Bitmap 高斯模糊         RelativeLayout
     *
     * @param context
     * @param errImg
     * @param url
     * @param bgLayout
     */

    @SuppressLint("CheckResult")
    public static void showImageViewBlur(Context context, int errImg,
                                         String url, final RelativeLayout bgLayout) {

        // 设置高斯模糊
        RequestOptions requestOptions = new RequestOptions();
        requestOptions.transform(new BlurTransformation(15, 5));

        Glide.with(context).load(url).error(errImg)
                .transition(DrawableTransitionOptions.withCrossFade())
                // 设置错误图片
                .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
                // 缓存修改过的图片
                .placeholder(errImg)
                .apply(requestOptions)
                // 设置占位图
                .into(new CustomTarget<Drawable>() {

                    @Override
                    public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                        bgLayout.setBackground(resource);
                    }

                    @Override
                    public void onLoadCleared(@Nullable Drawable placeholder) {
                        bgLayout.setBackground(placeholder);
                    }

                });

    }

    /**
     * （7）
     * 获取到Bitmap 高斯模糊 LinearLayout
     *
     * @param context
     * @param errImg
     * @param url
     * @param bgLayout
     */

    @SuppressLint("CheckResult")
    public static void showImageViewBlur(Context context, int errImg,
                                         String url, final LinearLayout bgLayout) {
        // 设置高斯模糊
        RequestOptions requestOptions = new RequestOptions();
        requestOptions.transform(new BlurTransformation(15, 5));

        Glide.with(context).load(url).error(errImg)
                // 设置错误图片
                .transition(DrawableTransitionOptions.withCrossFade())
                .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
                // 缓存修改过的图片
                .placeholder(errImg)
                .apply(requestOptions)
                // 设置占位图
                .into(new CustomTarget<Drawable>() {
                    @Override
                    public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                        bgLayout.setBackground(resource);
                    }

                    @Override
                    public void onLoadCleared(@Nullable Drawable placeholder) {
                        bgLayout.setBackground(placeholder);
                    }
                });

    }

    /**
     * （8）
     * 显示图片 圆角显示  ImageView
     *
     * @param context   上下文
     * @param errImg    错误的资源图片
     * @param url       图片链接
     * @param imageView 组件
     */
    @SuppressLint("CheckResult")
    public static void showImageViewToCircle(Application context, int errImg,
                                             String url, ImageView imageView) {

        // 圆形转换
        RequestOptions requestOptions = new RequestOptions();
        requestOptions.circleCrop();

        Glide.with(context).load(url)
                // 加载图片
                .error(errImg)
                // 设置错误图片
                .transition(DrawableTransitionOptions.withCrossFade())
                // 设置淡入淡出效果，默认300ms，可以传参
                .placeholder(errImg)
                // 设置占位图
                .apply(requestOptions)//圆角
                .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)// 缓存修改过的图片
                .into(imageView);
        // Glide.with(context).load(url).thumbnail(0.1f).error(errImg)
        // .into(imageView);

        // Glide
        // .with(context)
        // .load(UsageExampleListViewAdapter.eatFoodyImages[0])
        // .placeholder(R.mipmap.ic_launcher) //设置占位图
        // .error(R.mipmap.future_studio_launcher) //设置错误图片
        // .crossFade() //设置淡入淡出效果，默认300ms，可以传参
        // //.dontAnimate() //不显示动画效果
        // .into(imageViewFade);

    }
/**
 * Crop
 CropTransformation, CropCircleTransformation, CropSquareTransformation, RoundedCornersTransformation
 Color
 ColorFilterTransformation, GrayscaleTransformation
 Blur
 BlurTransformation
 Mask
 MaskTransformation
 */
    /**
     * （9）
     * 多种样式（模糊+圆角） ImageView
     *
     * @param context   上下文
     * @param errImg    错误的资源图片
     * @param url       图片链接
     * @param imageView 组件
     */
    @SuppressLint("CheckResult")
    public static void showImageViewToCircleAndBlur(Application context, int errImg,
                                                    String url, ImageView imageView) {

        // 设置高斯模糊，圆角
        RequestOptions requestOptions = new RequestOptions();
        requestOptions.transform(new BlurTransformation(15, 5));
        requestOptions.circleCrop();

        Glide.with(context).load(url)
                .error(errImg)// 设置错误图片
                .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)// 缓存修改过的图片
                .into(imageView);
    }

    /**
     * （10）
     * 矩形圆角 ImageViewR
     *
     * @param context   上下文
     * @param errImg    错误的资源图片
     * @param url       图片链接
     * @param imageView 组件
     */
    public static void showImageViewToRoundedCorners(Application context, int errImg,
                                                     String url, ImageView imageView) {

        // // 设置矩形圆角
        RequestOptions requestOptions = new RequestOptions();
        requestOptions.transform(new RoundedCornersTransformation(30, 0, RoundedCornersTransformation.CornerType.ALL));
        Glide.with(context).load(url)
                .error(errImg)// 设置错误图片
                .apply(requestOptions)
                .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)// 缓存修改过的图片
                .into(imageView);
    }

    /**
     * （11）有点问题
     * 遮罩图层 ImageView
     *
     * @param context   上下文
     * @param errImg    错误的资源图片
     * @param url       图片链接
     * @param imageView 组件
     */
    @SuppressLint("CheckResult")
    public static void showImageViewToMask(Context context, int errImg,
                                           String url, ImageView imageView) {
        // 设置高斯模糊
        RequestOptions requestOptions = new RequestOptions();
        requestOptions.transform(new VignetteFilterTransformation(
                new PointF(0.5f, 0.5f),
                new float[]{0.0f, 0.0f, 0.0f}, 0f, 0.75f));
        Glide.with(context).load(url)
                .error(errImg)// 设置错误图片
                .apply(requestOptions)
                .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)// 缓存修改过的图片
                .into(imageView);
    }
}
